package prvydevj;

import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;


/**
 * Table model pro tabulku zobrazující transakce na účtě.
 * User: marpies
 * Date: 5/3/13
 * Time: 10:59 PM
 * To change this template use File | Settings | File Templates.
 */
public class TransactionTableModel extends AbstractTableModel {

    private List<Transaction> records;

    /**
     * Vytvoří model pro tabulku transakcí.
     */
    public TransactionTableModel() {
        records = new ArrayList<Transaction>();
    }

    /**
     * Přidání položky do tabulky.
     * @param transaction Transakce, která má být přidána
     */
    public void add( Transaction transaction ) {
        records.add(transaction);
        int lastRow = records.size() - 1;
        fireTableRowsInserted(lastRow, lastRow);
    }

    /**
     * Vrací počet řádků v tabulce.
     * @return počet řádků
     */
    @Override
    public int getRowCount() {
        return records.size();
    }

    /**
     * Vrací počet sloupců v tabulce.
     * @return počet sloupců
     */
    @Override
    public int getColumnCount() {
        return 5;
    }

    /**
     * Vrací hodnotu z tabulky nacházející se na daném indexu řádku a sloupce
     * @param rowIndex index řádku
     * @param columnIndex index sloupce
     * @return hodnota tabulky v daném řádku a sloupci
     * @throws IllegalArgumentException index sloupce je mimo rozsah
     */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Transaction transaction = records.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return transaction.getVystaveni();
            case 1:
                return transaction.getSplatnost();
            case 2:
                return transaction.getUcet();
            case 3:
                return transaction.getPrijem() ? transaction.getCastka() : transaction.getCastka().negate();
            case 4:
                return "Faktura";
            default:
                throw new IllegalArgumentException("columnIndex");
        }
    }

    /**
     * Získání hodnoty, zda je daná buňka tabulky editovatelná
     * @param rowIndex index řádku
     * @param columnIndex index sloupce
     * @return true v případě možnosti editovat buňku, jinak false
     */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return columnIndex == 4;
    }

    /**
     * Vrací název sloupce podle indexu
     * @param column index sloupce
     * @return název sloupce
     * @throws IllegalArgumentException index sloupce je mimo rozsah
     */
    @Override
    public String getColumnName(int column) {
        switch (column) {
            case 0:
                return "Datum vystavení";
            case 1:
                return "Datum splatnosti";
            case 2:
                return "Číslo účtu";
            case 3:
                return "Částka (CZK)";
            case 4:
                return "";
            default:
                throw new IllegalArgumentException("column");
        }
    }

    /**
     * Datový typ reprezentující hodnoty v daném sloupci
     * @param columnIndex index sloupce
     * @return datový typ sloupce
     * @throws IllegalArgumentException index sloupce je mimo rozsah
     */
    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
        case 0:
        case 1:
            return Date.class;
        case 2:
            return String.class;
        case 3:
            return BigDecimal.class;
        case 4:
            return String.class;
        default:
            throw new IllegalArgumentException("columnIndex");
        }
    }

    /**
     * Vrací nemodifikovatelnou kolekci všch záznamů v tabulce
     * @return kolekce záznamů
     */
    public List<Transaction> getRecords()
    {
        return Collections.unmodifiableList(records);
    }

    /**
     * Vymaže všechny záznamy
     */
    public void clear() {
        records.clear();
    }
}